<?php
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

//$teste = setlocale(LC_ALL, "ptb_bra");

include_once 'abstract_dao.php';
include_once 'dao_usuario.php';
include_once 'model_cliente.php';

class dao_cliente extends abstract_dao{
    
    public function insert(model_cliente $dados){
        $sql = "INSERT INTO `cliente`(`CID_ID`,`USU_ID` ,`CLI_NOME`, `CLI_FANTASIA`, `CLI_CNPJ_CPF`, `CLI_TIPO`, `CLI_IE_RG`,
        `CLI_EMAIL`, `CLI_MSN`, `CLI_SKYPE`, `CLI_DESCRICAO`, `CLI_DATA_CADASTRO`, `CLI_LOGRADOURO`, `CLI_COMPLEMENTO`, `CLI_CEP`,
        `CLI_BAIRRO`, `CLI_TEL1`, `CLI_TEL2`, `CLI_CELULAR`, `CLI_FAX`) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 
        CURDATE(), ?, ?, ?, ? , ?, ?, ?, ?) ";
        
        $this->pdo->beginTransaction();
        
        $stmt = $this->pdo->prepare($sql);

    
        // Crio uma instancia de dao_usuario
        $dao_usuario = new dao_usuario();
    
        // Cadastro um novo usuario
        try{
            $dados->USU_ID = $dao_usuario->insert($dados->getModelFilho("usuario"));
        }catch (Exception $e){
            $this->pdo->rollBack();
            throw $e;
        }
        
        $sucesso = $stmt->execute(array ( $dados->CID_ID, $dados->USU_ID, $dados->CLI_NOME, $dados->CLI_FANTASIA, $dados->CLI_CNPJ_CPF,
        $dados->CLI_TIPO, $dados->CLI_IE_RG, $dados->CLI_EMAIL, $dados->CLI_MSN, $dados->CLI_SKYPE, $dados->CLI_DESCRICAO, $dados->CLI_LOGRADOURO,
        $dados->CLI_COMPLEMENTO, $dados->CLI_CEP, $dados->CLI_BAIRRO, $dados->CLI_TEL1, $dados->CLI_TEL2, $dados->CLI_CELULAR, $dados->CLI_FAX));
        
        if ($sucesso){
            if($stmt->rowCount() == 0){
                $this->pdo->rollBack();
                throw new DAOException ("Erro ao inserir cliente. Nenhuma linha afetada");
            }else{
                $retorno = $this->pdo->lastInsertId();
                $this->pdo->commit();
                return $retorno;
            }
        }else{
            $this->pdo->rollBack ();
            var_dump ($stmt->errorInfo());
            throw new DAOException ("Erro ao inserir cliente. A Prepared Statement nao pode ser executada.");
        }
    }

    public function update(model_cliente $dados){
        $sql = "UPDATE `cliente` SET `CID_ID` = ?, `CLI_NOME` = ?, `CLI_FANTASIA` = ?, `CLI_CNPJ_CPF` = ?, `CLI_TIPO` = ?, `CLI_IE_RG` = ?,
        `CLI_EMAIL` = ?, `CLI_MSN` = ?, `CLI_SKYPE` = ?, `CLI_DESCRICAO` = ?, `CLI_LOGRADOURO` = ?, `CLI_COMPLEMENTO` = ?,
        `CLI_CEP` = ?, `CLI_BAIRRO` = ?, `CLI_TEL1` = ?, `CLI_TEL2` = ?, `CLI_CELULAR` = ?, `CLI_FAX` = ? WHERE CLI_ID = ?";
        
        $stmt = $this->pdo->prepare($sql);
        
        $sucesso = $stmt->execute(array ( $dados->CID_ID, $dados->CLI_NOME, $dados->CLI_FANTASIA, $dados->CLI_CNPJ_CPF, $dados->CLI_TIPO,
            $dados->CLI_IE_RG, $dados->CLI_EMAIL, $dados->CLI_MSN, $dados->CLI_SKYPE, $dados->CLI_DESCRICAO, $dados->CLI_LOGRADOURO, 
            $dados->CLI_COMPLEMENTO, $dados->CLI_CEP, $dados->CLI_BAIRRO, $dados->CLI_TEL1, $dados->CLI_TEL2, $dados->CLI_CELULAR,
            $dados->CLI_FAX, $dados->CLI_ID));
        
        if($sucesso){
            return $dados->CLI_ID;
        }else{
            var_dump ($stmt->errorInfo());
            throw new DAOException ("Erro ao atualizar o cliente. A Prepared Statement nao pode ser executada.");
        }
    }
    
    public function updateCLI_EMAIL(model_cliente $dados){
        $sql = "UPDATE `cliente` SET `CLI_EMAIL` = ? WHERE `CLI_ID` = ?";
        
        $stmt = $this->pdo->prepare($sql);
        
        $sucesso = $stmt->execute(array ($dados->CLI_EMAIL, $dados->CLI_ID));
        
        if($sucesso){
            return $dados->CLI_ID;
        }else{
            var_dump ($stmt->errorInfo());
            throw new DAOException ("Erro ao atualizar o email. A Prepared Statement nao pode ser executada.");
        }
    }

    public function select($id){
        $retorno = null;
        $sql_select = "SELECT * FROM `cliente` AS CLI INNER JOIN `vw_cidade` AS CID ON CLI.CID_ID = CID.CID_ID WHERE `CLI_ID` LIKE ?";
        
        $stmt = $this->pdo->prepare($sql_select);
        
        if ($stmt->execute(array($id))){
            while($dados = $stmt->fetch(PDO::FETCH_ASSOC)){
                $retorno = new model_cliente();
                $retorno->populateFromBanco($dados);
            }
        }
        return $retorno;
    }
    
    public function selectByUSU_ID($id){
        $retorno = null;
        $sql_select = "SELECT * FROM `cliente` AS CLI INNER JOIN `cidade` AS CID ON CLI.CID_ID = CID.CID_ID WHERE `USU_ID` LIKE ?";
        
        $stmt = $this->pdo->prepare($sql_select);
        
        if ($stmt->execute(array($id))){
            while($dados = $stmt->fetch(PDO::FETCH_ASSOC)){
                $retorno = new model_cliente();
                $retorno->populateFromBanco($dados);
            }
        }
        return $retorno;
    }
    
    public function select_all(){
        $retorno = array();
        $sql = "SELECT * FROM CLIENTE";
        $stmt = $this->pdo->exec($sql);
        
        if ($stmt){
            while($dados = $stmt->fetch(PDO::FETCH_ASSOC)){
                $retorno[] = new model_cliente($dados);
            }
        }
        return $retorno;
    }
    
    public function checaCnpjCpf(){
        if(func_num_args() == 2){
            $sql = "SELECT CLI_CNPJ_CPF FROM cliente WHERE CLI_CNPJ_CPF LIKE ? AND CLI_ID <> ?";
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute(array(func_get_arg(0), func_get_arg(1)));
            return $stmt->rowCount();
        }else{
            $sql = "SELECT CLI_CNPJ_CPF FROM cliente WHERE CLI_CNPJ_CPF LIKE ?";
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute(array(func_get_arg(0)));
            return $stmt->rowCount();
        }
    }
    
    /**
     * Checa qual cliente ja possui 30 dias de cadastro a partir de um determinado id
     * @param int $id Maior cliente a ser descartado
     */
    public function checaCadastroMaior30Dias($id){
        $sql_select = "SELECT * FROM cliente WHERE CLI_DATA_CADASTRO <  SUBDATE(CURDATE(), INTERVAL 30 DAY) AND CLI_ID > ?;";
        
        $stmt = $this->pdo->prepare($sql_select);
        
        $retorno = array();
        if ($stmt->execute(array($id))){
            while($dados = $stmt->fetch(PDO::FETCH_ASSOC)){
                $cliente = new model_cliente();
                $cliente->populateFromBanco($dados);
                $retorno[] = $cliente;
            }
        }
        return $retorno;
    }

}

?>
